package 简单.动态规划.其他;

/**
 * Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。
 * <p>
 * 最开始，他在周一的时候存入 1 块钱。从周二到周日，他每天都比前一天
 * 多存入 1 块钱。在接下来每一个周一，他都会比 前一个周一 多存入 1 块钱。
 * <p>
 * 给你 n ，请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。
 * <p>
 * 来源：力扣（LeetCode）
 */
public class 计算力扣银行的钱_1716 {

    public static void main(String[] args) {

        System.out.println(efficientotalMoney(10));

    }

    /**
     * 子问题2：
     * 第n天存多少钱在？
     * 如果是周一 ，n%7=1，dp[n]=dp[n-7]+1
     * 如果不是周一，dp[n]=dp[n-1]+1
     * 子问题2：
     * 到第n天总共存多少钱？
     * 递推关系2
     * dp[n]=dp[n-1]+curMoney
     *
     * @param n
     * @return
     */
    public static int totalMoney(int n) {
        int[] dayDp = new int[n];
        int[] totalDp = new int[n];
        dayDp[0] = 1;
        totalDp[0] = 1;
        for (int i = 1; i < n; i++) {
            if ((i + 1) % 7 == 1) {  //周一
                dayDp[i] = dayDp[i - 7] + 1;
            } else {
                dayDp[i] = dayDp[i - 1] + 1;
            }
            totalDp[i] = totalDp[i - 1] + dayDp[i];
        }
        return totalDp[n - 1];
    }

    /**
     * 空间优化
     *
     * @param n
     * @return
     */
    public static int efficientotalMoney(int n) {
        int preMonday = 1, preDay = 1, curDay;
        int preTotal = 1, curTotal = 1;
        for (int i = 1; i < n; i++) {
            if ((i + 1) % 7 == 1) {  //周一
                curDay = preMonday + 1;
                preMonday = curDay;
                preDay = curDay;
            } else {
                curDay = preDay + 1;
                preDay = curDay;
            }
            curTotal = preTotal + curDay;
            preTotal = curTotal;
        }
        return curTotal;
    }

}
